package com.puppet.listener;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Duration;
import java.util.HashMap;

@RestController
@RequestMapping("/user")
@Api(tags = "用户接口")
@Slf4j
public class UserController {
    @Value("${spring.mail.username}")
    private String from;

    //注入Rabbit模板类
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //注入RedisTemplate类
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/send")
    @ApiOperation("发送邮件")
    public ResponseEntity<?> sendEmail(String address){
        //这个参数address，就是前端传进来的用户注册的邮箱号，也就是接受验证码的账号

        //生成4位验证码
        String code = RandomStringUtils.randomNumeric(4);
        String context = "注册的验证码是：" + code + ",该验证码10分钟内有效";

        //把消息封装到一个Map中，给MQ
        HashMap<String, Object> emailData = new HashMap<>();
        emailData.put("from",from);  //发件人
        emailData.put("to",address);  //收件人
        emailData.put("subject","蜗牛书城：注册验证码");
        emailData.put("content",context);

        //发送消息到RabbitMQ队列中 参数1：队列名称，参数2：消息内容
        rabbitTemplate.convertAndSend("email.queue",emailData);

        log.info("邮箱验证码{}",context);

        /*将数据存储在Redis中，时间设置为15分钟，邮箱地址是键：这个邮箱地址就是用户注册的那个邮箱
        这个键在正式项目中都是要用一个前缀名+：+邮箱地址的，我这里只搭了一个简易的mq项目，因此就没有这种东西，
        自己简单写一个前缀名
         */
        redisTemplate.opsForValue().set("MQ测试" + ":" + address,code, Duration.ofMinutes(15));
        return ResponseEntity.ok("验证码" + code + "已经发送到" + address + "邮箱，请查收!");



    }
}
